/** 
 * 都是定义对象或函数的形状
 */

interface example {
  name: string,
  age: number
}

interface exampleFunc {
  (name: string, age: number): void
}

type example01 = {
  name: string,
  age: number
}

type exampleFunc01 = (name: string, age: number) => void

/**
 * 都可以继承，并且相互继承。但interface通过extends实现，type通过&实现
 */

type aa = {
  name: string
}

interface bb {
  name: string
}

type cc01 = aa & {
  age: number
}

type cc02 = bb & {
  age: number
}

interface dd01 extends aa {
  age: number
}

interface dd02 extends bb {
  age: number
}

/**
 * 不同点
 * 1. type可以定义基本类型的别名
 * 2. type可以申明联合类型
 * 3. type可以申明元组
 * 4. type可以通过typeof 操作符来定义
 * 
 * interface可以 声明合并，这种情况下，如果是type的话，就会报 重复定义 的警告，因此是无法实现 声明合并 的。
 */
const aaa = {}
type myStr = string
type myType = typeof aaa
type union = myStr | myType

